package senior.ioExer2;

import org.junit.Test;

import java.io.File;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Scanner;

/**
 * 输入一个目录，求这个目录占用的空间大小
 * （包括子目录，以及子子目录。。。）
 * @author shkstart
 * @creat 2022-04-14:48
 */
public class Exer3import {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("输入目录名：");
        String path = sc.next();
        File file = new File(path);
        if(!file.isDirectory()){
            System.out.println("不是文件夹");
            return;
        }
        ArrayList<String> hashSet = new ArrayList<>();
        long directory = findDirectory(file, hashSet);
        System.out.println(file.getName() + "的大小：" + directory);
        System.out.println(hashSet.size() + "个文件夹");
        Iterator<String> iterator = hashSet.iterator();
        while (iterator.hasNext()) {
            String next = iterator.next();
            System.out.println(next);
        }


    }

    //改良版，使用集合LinkedList
    //1）从集合中拿到一个File,并删除。
    //2）处理这个文：是文件夹，把他的下级放入集合；否则计算他们的大小
    //3）循环1和2，直到集合是空的
    public static void calc(File file){
        long size = 0;
        int count = 0;
        if(!file.isDirectory()){
            System.out.println("不是文件夹");
            return;
        }
        LinkedList<File> list = new LinkedList<>();
        list.add(file);
        while (list.size() > 0){
            File file1 = list.removeFirst();
//            System.out.println(file1.getName());
//            count++;
            if(file1.isFile()){
                size += file1.length();
                continue;
            }
            File[] listFiles = file1.listFiles();
            for(int i =0;i < listFiles.length;i++){
                if(listFiles[i].isDirectory()){
                    list.addLast(listFiles[i]);
                    System.out.println(listFiles[i].getName());
                    count++;
                }else {
                    size += listFiles[i].length();
                }

            }
        }
        System.out.println(file.getName() + "有" + count +"个文件夹，大小：" + size + "字节");
    }
    @Test
    public void testCalc(){
        File file = new File("D:/workspace");
        calc(file);
    }

    //作业版，递归加集合，集合画蛇添足了
    //递归会浪费内存
    public static long findDirectory(File file, ArrayList<String> hashSet) {
        long length = 0;
//        if(!file.isDirectory()){
//            length += file.length();
//            return length ;
//        }
        String[] list = file.list();
        for(int i = 0;i < list.length;i++){
            File dir = new File(file,list[i]);
            if(dir.isFile()){
                length += dir.length();
            }else {
                hashSet.add(list[i]);
                length += findDirectory(dir,hashSet);
            }
        }
        return length;
    }
}
